package com.pf.utils;

import java.security.SecureRandom;

public class StringUtils {

    public static void main(String[] args) {
        System.out.println(regexPassword("Abc12345"));
        System.out.println(randomPwdStr(8));
        System.out.println(randomPwdStr(8));
    }

    private static SecureRandom random = new SecureRandom();

    /**
     * 密码至少一个大写字母 + 一个小写字母 + 一个数字，长度 8-20位
     *
     * @param password
     * @return
     */
    public static boolean regexPassword(String password) {
        return password.matches("^(?=.*[A-Z])(?=.*[a-z])(?=.*\\d)[a-zA-Z\\d]{8,20}$");

    }

    /**
     * 随机生成指定长度的字符串
     *
     * @param length
     * @return
     */
    public static String randomStr(int length) {
        final char[] charArray = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890".toCharArray();
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < length; i++) {
            sb.append(charArray[random.nextInt(charArray.length)]);
        }
        return sb.toString();
    }

    /**
     * 随机生成指定长度的密码（密码至少有一个大写字母+一个小写字母+一个数字，长度8-20位）
     *
     * @param length
     * @return
     */
    public static String randomPwdStr(int length) {
        if (length < 8 || length > 20) {
            throw new RuntimeException("长度必须在【8-20】之间");
        }
        String pwd = randomStr(length);
        while (regexPassword(pwd)) {
            return pwd;
        }
        return randomPwdStr(length);
    }

    /**
     * 任意字符串转半角
     * 全角空格为 12288，半角空格为32
     * 其他字符半角（33-126）与全角（65281-65374）的对应关系是：均相差65248
     *
     * @param str
     * @return
     */
    public static String toDBC(String str) {
        char[] charArray = str.toCharArray();
        for (int i = 0; i < charArray.length; i++) {
            if (charArray[i] == 12288) {
                // 全角空格为 12288，半角空格为32
                charArray[i] = (char) 32;
                continue;
            }
            if (charArray[i] > 65280 && charArray[i] < 65375) {
                // 其他字符半角（33-126）与全角（65281-65374）的对应关系是：均相差65248
                charArray[i] = (char) (charArray[i] - 65248);
            }
        }
        return new String(charArray);
    }


    /**
     * 任意字符串半角转全角
     * <p>
     * 全角空格为12288，半角空格为32
     * 其他字符半角（33-126）与全角（65281-65374）的对应关系是：均相差65248
     *
     * @param str
     * @return
     */
    public static String toSBC(String str) {
        char[] charArray = str.toCharArray();
        for (int i = 0; i < charArray.length; i++) {
            if (charArray[i] == 32) {
                charArray[i] = (char) 12288;
                continue;
            }
            if (charArray[i] < 127) {
                charArray[i] = (char) (charArray[i] + 65248);
            }
        }
        return new String(charArray);
    }
}
